home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / MacGzip 1.0 / source / Mac / MacBinary.c < prev    next >
Text File  |  1995-09-06  |  6KB  |  199 lines

  1. /*
  2.  * MacBinary II+ stuff
  3.  * From Peter N. Lewis (MacBinary II+ 1.0.0 crc.a)
  4.  */
  5.  
  6. #include "Macbinary.h"
  7. #define    PStrCpy(a,b)        BlockMove((b), (a), *(b) + 1 )
  8.  
  9. static short CalcMBCRC( unsigned long count, char *buffer);
  10.  
  11.  
  12. OSErr SetCatInfoFromMBHeader( FSSpec *myFSSpec, MBIIStartHeader *start, MBIIHeader *header)
  13. {
  14.     OSErr                error = noErr;
  15.     CInfoPBRec            myParamBlock;
  16.     
  17.     myParamBlock.hFileInfo.ioNamePtr                = myFSSpec->name;
  18.     myParamBlock.hFileInfo.ioVRefNum                 = myFSSpec->vRefNum;
  19.     myParamBlock.hFileInfo.ioFDirIndex                = 0;
  20.     myParamBlock.hFileInfo.ioDirID                    = myFSSpec->parID;
  21.     
  22.     if ( noErr == (error = PBGetCatInfo( (CInfoPBPtr) &myParamBlock, false )))
  23.     {
  24.         myParamBlock.hFileInfo.ioNamePtr                = myFSSpec->name;
  25.         myParamBlock.hFileInfo.ioVRefNum                 = myFSSpec->vRefNum;
  26.         myParamBlock.hFileInfo.ioFDirIndex                = 0;
  27.         myParamBlock.hFileInfo.ioDirID                    = myFSSpec->parID;
  28.         myParamBlock.hFileInfo.ioFlFndrInfo.fdType        = start->ftype;
  29.         myParamBlock.hFileInfo.ioFlFndrInfo.fdCreator    = start->fcreator;
  30.         myParamBlock.hFileInfo.ioFlFndrInfo.fdFlags     =
  31.                 ((start->flags_high << 8) & 0xFF00) | (start->flags_low & 0x00FF);
  32.                 
  33.         myParamBlock.hFileInfo.ioFlFndrInfo.fdFlags        &= !(fInvisible );
  34.         
  35.         myParamBlock.hFileInfo.ioFlFndrInfo.fdLocation    = start->flocation;
  36.         myParamBlock.hFileInfo.ioFlCrDat                = start->create_date;
  37.         myParamBlock.hFileInfo.ioFlMdDat                = start->mod_date;
  38.     
  39.         error = PBSetCatInfo(& myParamBlock, false);
  40.     }
  41.     return error;
  42. }
  43.  
  44. OSErr MBHeaderFromFSSpec( FSSpec *myFSSpec, MBIIStartHeader *start, MBIIHeader *header)
  45. {
  46.     OSErr                error = noErr;
  47.     CInfoPBRec            myParamBlock;
  48.     FInfo                *myFInfo = & (myParamBlock.hFileInfo.ioFlFndrInfo);
  49.     
  50.     myParamBlock.hFileInfo.ioNamePtr =        myFSSpec->name;
  51.     myParamBlock.hFileInfo.ioVRefNum =        myFSSpec->vRefNum;
  52.     myParamBlock.hFileInfo.ioDirID =        myFSSpec->parID;
  53.     myParamBlock.hFileInfo.ioFDirIndex =    0;
  54.  
  55.     if ( noErr == (error = PBGetCatInfo( (CInfoPBPtr) &myParamBlock, false )))
  56.     {
  57.  
  58. /*        memset((char*)start,0x00,sizeof(*start)); *//* just cosmetic */
  59. /*        memset((char*)header,0x00,sizeof(*header)); *//* just cosmetic */
  60.  
  61.         PStrCpy( start->name,  myFSSpec->name);
  62.         start->ftype            = myFInfo->fdType;
  63.         start->fcreator            = myFInfo->fdCreator;
  64.         start->flags_high        = ( myFInfo->fdFlags >> 8 );
  65.         start->flags_low        = myFInfo->fdFlags;
  66.         start->zero1            = 0;
  67.         start->flocation        = myFInfo->fdLocation;
  68.         start->windowID            = myFInfo->fdFldr;
  69.         start->protected        = 0;
  70.         start->zero2            = 0;
  71.         start->dlen                = myParamBlock.hFileInfo.ioFlLgLen;
  72.         start->rlen                = myParamBlock.hFileInfo.ioFlRLgLen;
  73.         start->create_date        = myParamBlock.hFileInfo.ioFlCrDat;
  74.         start->mod_date            = myParamBlock.hFileInfo.ioFlMdDat;
  75.         start->clen                = 0;
  76.         
  77.         header->version                = 0;
  78.         BlockMove( start, &(header->MBIIStart), sizeof(*start));
  79.         header->total_unpack_len    = 0L;
  80.         header->second_header_len    = 0L;
  81.         header->versionII            = 129;
  82.         header->minversionII        = 129;
  83.         header->crc                    = CalcMBCRC( 124, (char *) header);
  84.         header->processorID            = 0;
  85.     }
  86.     return error;    
  87. }
  88.  
  89.  
  90. short ValidateMBHeader( MBIIStartHeader *start, MBIIHeader *header, Boolean handle2plus )
  91. {
  92.     short packet_type = PT_None;
  93.     
  94.     BlockMove(&(header->MBIIStart), start, sizeof(*start));
  95.     
  96.     if ((header->version <= handle2plus) && (*((char*)header + 74 ) == 0x00 ))
  97.     {
  98.         if (header->crc == CalcMBCRC( 124, (char *) header) )
  99.         {
  100.             if (
  101.                     (header->version == 1) &&
  102.                     (start->ftype == macbin_folder_ftype) &&
  103.                     (
  104.                         (start->fcreator == macbin_folder_creator_start) ||
  105.                         (start->fcreator == macbin_folder_creator_end)
  106.                     )
  107.                 )
  108.             {
  109.                 packet_type = (start->fcreator == macbin_folder_creator_start) ? PT_StartBlock : PT_EndBlock;
  110.             }
  111.             else
  112.             {
  113.                 packet_type = PT_File;
  114.             }
  115.         }
  116.         else /* MacBinary I */
  117.         {
  118.             if (
  119.                     (header->version == 0) &&
  120.                     (*((char*)header + 1 ) >= 1 ) &&
  121.                     (*((char*)header + 1 ) <= 31 )
  122.                 )
  123.             {
  124.                     *((char*)header + 101 )        = 0x00 ; /* Zero out the flags low_byte */
  125.                     header->total_unpack_len    = 0;
  126.                     header->second_header_len    = 0;
  127.                     header->versionII            = 129;
  128.                     header->minversionII        = 129;
  129.                     header->crc                    = 0;
  130.                     header->processorID            = 0;
  131.             }
  132.         }
  133.     }
  134.     return packet_type;
  135. }
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143. static short CalcMBCRC( unsigned long count, char *buffer)
  144. {
  145.     register unsigned long    i;
  146.     register short            crc;
  147.     register char            *c;
  148.     
  149.     extern unsigned short    crc_16_tab[];
  150.     
  151.     for( i=0, crc=0, c = buffer; i< count; i++)
  152.     {
  153.         crc =     (( crc & 0x00ff )  << 8)
  154.                 ^
  155.                 crc_16_tab [
  156.                             (( crc & 0xff00 ) >> 8)
  157.                             ^
  158.                             ( (short) c[i] & 0x00ff )
  159.                             ];
  160.     }
  161.     return crc;
  162. }
  163.  
  164.  
  165. unsigned short crc_16_tab[] = {
  166.         0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
  167.         0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
  168.         0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
  169.         0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
  170.         0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
  171.         0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
  172.         0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
  173.         0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
  174.         0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
  175.         0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
  176.         0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
  177.         0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
  178.         0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
  179.         0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
  180.         0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
  181.         0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
  182.         0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
  183.         0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
  184.         0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
  185.         0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
  186.         0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
  187.         0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
  188.         0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
  189.         0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
  190.         0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
  191.         0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
  192.         0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
  193.         0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
  194.         0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
  195.         0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
  196.         0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
  197.         0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
  198.     };
  199.